home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 251_01 / advtrm.c < prev    next >
Text File  |  1987-10-27  |  3KB  |  183 lines

  1. /* advtrm.c - terminal i/o routines */
  2. /*
  3.     Copyright (c) 1986, by David Michael Betz
  4.     All rights reserved
  5. */
  6.  
  7. #include <stdio.h>
  8.  
  9. /* useful definitions */
  10. #define TRUE    1
  11. #define FALSE    0
  12. #define EOS    '\0'
  13. #define LINEMAX    200
  14. #define WORDMAX    100
  15.  
  16. /* global variables */
  17. char line[LINEMAX+1];
  18.  
  19. /* local variables */
  20. static int col,maxcol,row,maxrow;
  21. static int scnt,wcnt;
  22. static char word[WORDMAX+1],*wptr;
  23. static FILE *logfp = NULL;
  24.  
  25. /* forward declarations */
  26. char *trm_line();
  27.  
  28. /* trm_init - initialize the terminal module */
  29. trm_init(rows,cols,name)
  30.   int rows,cols; char *name;
  31. {
  32.     /* initialize the terminal i/o variables */
  33.     maxcol = cols-1; col = 0;
  34.     maxrow = rows-1; row = 0;
  35.     wptr = word; wcnt = 0;
  36.     scnt = 0;
  37.  
  38.     /* open the log file */
  39.     if (name && (logfp = fopen(name,"w")) == NULL)
  40.     error("can't open log file");
  41. }
  42.  
  43. /* trm_done - finish terminal i/o */
  44. trm_done()
  45. {
  46.     if (wcnt) trm_word();
  47.     if (logfp) fclose(logfp);
  48. }
  49.  
  50. /* trm_get - get a line */
  51. char *trm_get(line)
  52.   char *line;
  53. {
  54.     if (wcnt) trm_word();
  55.     while (scnt--) putchr(' ');
  56.     row = col = scnt = 0;
  57.     return (trm_line(line));
  58. }
  59.  
  60. /* trm_str - output a string */
  61. trm_str(str)
  62.   char *str;
  63. {
  64.     while (*str)
  65.     trm_chr(*str++);
  66. }
  67.  
  68. /* trm_xstr - output a string without logging or word wrap */
  69. trm_xstr(str)
  70.   char *str;
  71. {
  72.     while (*str)
  73.     putch(*str++,stdout);
  74. }
  75.  
  76. /* trm_chr - output a character */
  77. trm_chr(ch)
  78.   int ch;
  79. {
  80.     switch (ch) {
  81.     case ' ':
  82.         if (wcnt)
  83.         trm_word();
  84.         scnt++;
  85.         break;
  86.     case '\t':
  87.         if (wcnt)
  88.         trm_word();
  89.         scnt = (col + 8) & ~7;
  90.         break;
  91.     case '\n':
  92.         if (wcnt)
  93.         trm_word();
  94.         trm_eol();
  95.         scnt = 0;
  96.         break;
  97.     default:
  98.         if (wcnt < WORDMAX) {
  99.             *wptr++ = ch;
  100.             wcnt++;
  101.         }
  102.         break;
  103.     }
  104. }
  105.  
  106. /* trm_word - output the current word */
  107. trm_word()
  108. {
  109.     if (col + scnt + wcnt > maxcol)
  110.     trm_eol();
  111.     else
  112.     while (scnt--)
  113.         { putchr(' '); col++; }
  114.     for (wptr = word; wcnt--; col++)
  115.     putchr(*wptr++);
  116.     wptr = word;
  117.     wcnt = 0;
  118.     scnt = 0;
  119. }
  120.  
  121. /* trm_eol - end the current line */
  122. trm_eol()
  123. {
  124.     putchr('\n');
  125.     if (++row >= maxrow)
  126.     { trm_wait(); row = 0; }
  127.     col = 0;
  128. }
  129.  
  130. /* trm_wait - wait for the user to type return */
  131. trm_wait()
  132. {
  133.     trm_xstr("  << MORE >>\r");
  134.     waitch();
  135.     trm_xstr("            \r");
  136. }
  137.  
  138. /* trm_line - get an input line */
  139. char *trm_line(line)
  140.   char *line;
  141. {
  142.     char *p;
  143.     int ch;
  144.  
  145.     p = line;
  146.     while ((ch = getchr()) != EOF && ch != '\n')
  147.     switch (ch) {
  148.     case '\177':
  149.     case '\010':
  150.         if (p != line) {
  151.             if (ch != '\010') putchr('\010',stdout);
  152.             putchr(' ',stdout);
  153.             putchr('\010',stdout);
  154.             p--;
  155.         }
  156.         break;
  157.     default:
  158.         if ((p - line) < LINEMAX)
  159.             *p++ = ch;
  160.         break;
  161.     }
  162.     *p = 0;
  163.     return (ch == EOF ? NULL : line);
  164. }
  165.  
  166. /* getchr - input a single character */
  167. int getchr()
  168. {
  169.     int ch;
  170.  
  171.     if ((ch = getch()) != EOF && logfp)
  172.     putch(ch,logfp);
  173.     return (ch);
  174. }
  175.  
  176. /* putchr - output a single character */
  177. putchr(ch)
  178.   int ch;
  179. {
  180.     if (logfp) putch(ch,logfp);
  181.     putch(ch,stdout);
  182. }
  183.